home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 3 / Amiga Tools 3.iso / audio / beatmaster / beatmaster.s < prev   
Text File  |  1995-06-19  |  5KB  |  209 lines

  1. *****************************************************************
  2. *                                *
  3. *        BeatMaster V0.1 -- BPM Zähler            *
  4. *                                *
  5. *****************************************************************
  6. *
  7. *    Von  Richard Körber  am   8. 9.1994
  8. *
  9. *****************************************************************
  10.  
  11.         INCDIR    "Include:"
  12.         INCLUDE    exec.i
  13.         INCLUDE    intuition.i
  14.  
  15.         SECTION    text,CODE
  16.         
  17. *---------------------------------------------------------------*
  18. *    EQUates definieren                    *
  19. *                                *
  20.     ;-- Farben -----------------------------;
  21. GREY        EQU    0            ;Standard-2.0-Farben
  22. BLACK        EQU    1
  23. WHITE        EQU    2
  24. BLUE        EQU    3
  25.     ;-- Tag-Nummern ------------------------;
  26. TAG_USER    EQU    $80000000
  27. TAG_DONE    EQU    $00000000
  28.     ;-- New-Window-Equates -----------------;
  29. nw_Screen    EQU    30
  30. wd_UserPort    EQU    $56
  31. CLOSEWINDOW    EQU    $0200
  32. RAWKEY        EQU    $0400
  33. WINDOWSIZING    EQU    1
  34. WINDOWDRAG    EQU    2
  35. WINDOWDEPTH    EQU    4
  36. WINDOWCLOSE    EQU    8
  37. SIZEBBOTTOM    EQU    $20
  38. ACTIVATE    EQU    $1000
  39. WBENCHSCREEN    EQU    $1
  40.  
  41. *---------------------------------------------------------------*
  42. *    == Start von WB ==                    *
  43. *                                *
  44. start        sub.l    a1,a1
  45.         exec    FindTask        ;Task suchen
  46.         move.l    d0,a4            ;Task in A4
  47.         tst.l    172(a4)        ;pr_CLI  prüfen
  48.         bne.b    .nomessage
  49.         lea    92(a4),a0        ;^Port
  50.         move.l    a0,-(sp)
  51.         exec    WaitPort        ;Auf Message warten
  52.         move.l    (sp)+,a0
  53.         exec    GetMsg            ; und abholen
  54.         move.l    d0,wbmessage
  55. .nomessage    bsr    s
  56.         move.l    wbmessage(PC),d7    ;Gab es eine?
  57.         beq.b    .nowbm
  58.         exec    Forbid
  59.         move.l    d7,a1            ;Beantworten
  60.         exec    ReplyMsg
  61.     ;-- Alles klar -------------------------;
  62. .nowbm        moveq    #0,d0            ;Kein Error
  63.         rts
  64.  
  65. *---------------------------------------------------------------*
  66. *  Los geht das Programm                    *
  67. *                                *
  68. s    ;-- Lib öffnen -------------------------;
  69.         lea    intuiname(PC),a1    ;Intuition öffnen
  70.         moveq    #33,d0            ;ab Kick 1.2 erlaubt!!!
  71.         exec    OpenLibrary
  72.         move.l    d0,intuibase
  73.     ;-- Window öffnen ----------------------;
  74.         lea    newwindow(PC),a0
  75.         intui    OpenWindow
  76.         move.l    d0,window
  77.         move.l    window(PC),a0        ;Nachricht
  78.         lea    itxtmsg(PC),a1
  79.         moveq    #0,d0            ;Offset X
  80.         moveq    #0,d1            ;Offset Y
  81.         move.b    $36(a0),d0
  82.         move.b    $37(a0),d1
  83.         move.l    $32(a0),a0        ;^RastPort
  84.         intui    PrintIText
  85.     ;-- Warte auf Message ------------------;
  86. .nxtmsg        move.l    window,a0
  87.         move.l    wd_UserPort(a0),a0    ;Port holen
  88.         move.l    a0,-(sp)
  89.         exec    WaitPort        ;Warten
  90.         move.l    (sp)+,a0
  91.         exec    GetMsg            ;Nachricht lesen
  92.         move.l    d0,a1            ; kann nur Close sein
  93.         move.l    $14(a1),d7        ;IDCMP merken
  94.         move.l    $24(a1),d6        ; Seconds,
  95.         move.l    $28(a1),d5        ; Micros natürlich auch
  96.         move    $18(a1),d4        ;Key
  97.         swap    d4
  98.         move    $1a(a1),d4        ;Qualifier
  99.         exec    ReplyMsg        ;Message beantworten
  100.     ;-- Message dekodieren -----------------;
  101.         cmp.l    #CLOSEWINDOW,d7
  102.         beq.b    exit
  103.         btst    #23,d4            ;Keycode für KeyUp?
  104.         bne.b    .nxtmsg            ; dann nächstes Event
  105.         cmp    #$0200,d4        ;Repeat?
  106.         beq.b    .nxtmsg            ; dann nächstes Event
  107.         move.l    seconds(PC),d0        ;Delta berechnen
  108.         move.l    micros(PC),d1
  109.         move.l    d6,seconds
  110.         move.l    d5,micros
  111.         sub.l    d0,d6
  112.         sub.l    d1,d5
  113.         bcc.b    .isok
  114.         subq.l    #1,d6            ;Sek -1
  115.         add.l    #1000000,d5        ;µ + 1M
  116. .isok        divu    #1000,d5        ;D5 kürzen auf 1000stel
  117.         swap    d5            ;Rest interessiert nicht
  118.         clr    d5
  119.         swap    d5
  120.         mulu    #1000,d6        ;Sek *100
  121.         add.l    d5,d6            ;D6: 1000tel Sekunden
  122.         beq.b    .flash
  123.         move.l    #1000*60,d0
  124.         divu    d6,d0            ;(100/100tel) * 60 = BPM
  125.         lea    buffer(PC),a0        ;Wandeln
  126.         bsr    bin2asc
  127.         move.l    window(PC),a0
  128.         lea    itxtbuff(PC),a1
  129.         moveq    #0,d0            ;Offset X
  130.         moveq    #0,d1            ;Offset Y
  131.         move.b    $36(a0),d0
  132.         move.b    $37(a0),d1
  133.         move.l    $32(a0),a0        ;^RastPort
  134.         intui    PrintIText
  135. .flash        move    #$0800,$dff180        ;Screen kurz flashen
  136.         bra.w    .nxtmsg
  137.     ;-- Window schließen -------------------;
  138. exit        move.l    window(PC),a0
  139.         intui    CloseWindow
  140.     ;-- Lib schließen ----------------------;
  141.         move.l    intuibase(PC),a1
  142.         exec    CloseLibrary
  143.     ;-- Fertig -----------------------------;
  144.         moveq    #0,d0            ;Alles OK
  145.         rts
  146.  
  147. *-------------------------------------------------------*
  148. * bin2asc    Wandelt Binär -> Ascii            *
  149. *    -» A0.l    ^Buffer (6 Bytes)            *
  150. *    -» D0.w    Zahl                    *
  151. *                            *
  152. bin2asc        move.l    #"    ",(a0)+
  153.         move    #"  ",(a0)+
  154.         and.l    #$ffff,d0        ;bereich einschränken
  155. .loop        divu    #10,d0
  156.         swap    d0
  157.         add.b    #"0",d0
  158.         move.b    d0,-(a0)
  159.         clr    d0
  160.         swap    d0
  161.         bne.b    .loop
  162.         rts
  163.  
  164. *-------------------------------------------------------*
  165. *    Datenstrukturen, Variablen, Texte        *
  166. *                            *
  167. wbmessage    dc.l    0            ;^WB-Msg oder 0
  168. intuibase    dc.l    0            ;^Intuibase
  169. window        dc.l    0            ;^Window
  170. seconds        dc.l    0            ;letzte Seconds
  171. micros        dc.l    0            ;letzte Micros
  172. buffer        ds.b    6            ;EVEN
  173.         dc.b    " BPM (Beats Per Minute)",0
  174.         even
  175.     ;-- Intui Text -------------------------;
  176. itxtbuff    dc.b    BLACK,GREY,1,0
  177.         dc.w    10,3
  178.         dc.l    0,buffer,0
  179. itxtmsg        dc.b    BLUE,GREY,1,0
  180.         dc.w    25,14
  181.         dc.l    0,.txt,0
  182. .txt        dc.b    "hit any key at every beat...",0
  183.         even
  184.     ;-- NewWindow-Struktur -----------------;
  185. newwindow    dc.w    50            ; nw_LeftEdge
  186.         dc.w    25            ; nw_TopEdge
  187.         dc.w    300            ; nw_Width
  188.         dc.w    40            ; nw_Height
  189.         dc.b    GREY            ; nw_DetailPen
  190.         dc.b    BLACK            ; nw_BlockPen
  191.         dc.l    CLOSEWINDOW!RAWKEY    ; nw_IDCMPFlags
  192.         dc.l    WINDOWDRAG!WINDOWDEPTH!WINDOWCLOSE!ACTIVATE
  193.         dc.l    0            ; nw_FirstGadget
  194.         dc.l    0            ; nw_CheckMark
  195.         dc.l    wndtitle        ; nw_Title
  196.         dc.l    0            ; nw_Screen (nachgetragen)
  197.         dc.l    0            ; nw_BitMap
  198.         dc.w    0,0            ; nw_MinWidth Height
  199.         dc.w    0,0            ; nw_MaxWidth Height
  200.         dc.w    WBENCHSCREEN        ; nw_Type
  201.     ;-- Texte ------------------------------;
  202. wndtitle    dc.b    'BeatMaster V0.1 by R.Körber',0
  203. intuiname    dc.b    'intuition.library',0
  204.  
  205. *---------------------------------------------------------------*
  206. *  Fertig                            *
  207. *                                *
  208.         END
  209.